package com.spring.sd;


import org.springframework.context.ApplicationContext;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.core.io.support.ResourcePatternResolver;

import java.io.IOException;

/**
 * ApplicationContext 接口继承了许多接口，可谓是接口的集大成者，其中：
 *
 * <li>EnvironmentCapable：提供获取 Environment 的能力</li>
 * <li>ListableBeanFactory：提供了获取某种类型的 Bean 集合的能力</li>
 * <li>HierarchicalBeanFactory：提供了获取父容器的能力</li>
 * <li>MessageSource：提供了对国际化信息进行处理的能力</li>
 * <li>ApplicationEventPublisher：提供了事件发布能力</li>
 * <li>ResourcePatternResolver：提供了通过通配符获取多个资源的能力</li>
 *
 * 虽然 ApplicationContext 继承了很多接口，但这些能力的实现是通过一种委派（Delegate）的方式实现的，
 * 这种方式也被叫做委派模式，但它并不属于 GoF 的 23 种设计模式中的一种，是一种面向对象的设计模式。什么是委派呢？<br/>
 *
 * <li>ApplicationContext 有一个子接口 ConfigurableApplicationContext，从类名就可以看出，它提供了对 ApplicationContext 进行配置的能力，
 * 浏览其内部方法可知，提供了诸如设置父容器、设置 Environment 等能力。</li>
 *
 * <li>ApplicationContext 有一个非常重要的抽象实现 AbstractApplicationContext，其他具体实现都会继承这个抽象实现，
 * 在其内部通过委派的方式实现了一些接口的能力，除此之外还有一个与 Spring Bean 的生命周期息息相关的方法：refresh()。</li>
 */
public abstract class ApplicationContextSupp implements ApplicationContext {

    private final ResourcePatternResolver resourcePatternResolver = new PathMatchingResourcePatternResolver();


    // 实现获取资源的方式并不是由实现类自身完成，而是交给其内部的一个成员变量完成，这样的方式就是委派（这和对象适配器模式很相似）
    @Override
    public Resource[] getResources(String locationPattern) throws IOException {
        return resourcePatternResolver.getResources(locationPattern);
    }
}
